// 以下注释详细展示了 RTCP 发送报告（Sender Report, SR）数据包的二进制结构，共 4 字节一行，完整呈现了数据包各部分的组成
// 0                   1                   2                   3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// header 	|V=2|P|    RC   |   PT=SR=200   |             length            |
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 			|                         SSRC of sender                        |
// 			+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// sender 	|              NTP timestamp, most significant word             |
// info   	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 			|             NTP timestamp, least significant word             |
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 			|                         RTP timestamp                         |
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 			|                     sender's packet count                     |
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 			|                      sender's octet count                     |
// 			+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// report 	|                 SSRC_1 (SSRC of first source)                 |
// block  	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 1    	| fraction lost |       cumulative number of packets lost       |
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 			|           extended highest sequence number received           |
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 			|                      interarrival jitter                      |
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 			|                         last SR (LSR)                         |
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 			|                   delay since last SR (DLSR)                  |
// 			+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// report 	|                 SSRC_2 (SSRC of second source)                |
// block  	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// 2    	:                               ...                             :
// 			+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// 			|                  profile-specific extensions                  |
// 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

use crate::rtsp::rtp::rtcp::errors::RtcpError;
use crate::rtsp::rtp::rtcp::rtcp_header::RtcpHeader;
use crate::rtsp::rtp::rtcp::rtcp_rr::ReportBlock;
use crate::rtsp::rtp::utils::{Marshal, Unmarshal};
use byteorder::BigEndian;
use bytes::BytesMut;
use bytesio::bytes_reader::BytesReader;
use bytesio::bytes_writer::BytesWriter;

// RTCP 发送报告结构体
#[derive(Debug, Clone, Default)]
pub struct RtcpSenderReport {
    // RTCP 通用头部，包含版本号、填充标志、报告计数、负载类型和长度等信息
    pub header: RtcpHeader,
    // 发送方的同步源标识符（SSRC），用于唯一标识 RTP 会话中的发送源
    pub ssrc: u32,
    // 网络时间协议（NTP）时间戳
    pub ntp: u64,
    // RTP 时间戳
    rtp_timestamp: u32,
    // 发送方发送的数据包总数
    sender_packet_count: u32,
    // 发送方发送的总字节数
    sender_octet_count: u32,
    // 接收报告块的向量，每个报告块包含了对一个接收源的接收情况统计信息
    pub report_blocks: Vec<ReportBlock>,
}

impl Unmarshal<&mut BytesReader, Result<Self, RtcpError>> for RtcpSenderReport {
    fn unmarshal(data: &mut BytesReader) -> Result<Self, RtcpError>
    where
        Self: Sized,
    {
        // 创建一个 RtcpSenderReport 实例，并从字节读取器中依次读取各部分数据进行初始化
        let mut sender_report = RtcpSenderReport {
            // 调用 RtcpHeader 的 unmarshal 方法解析 RTCP 头部
            header: RtcpHeader::unmarshal(data)?,
            // 以大端字节序读取 4 字节作为发送方的 SSRC
            ssrc: data.read_u32::<BigEndian>()?,
            // 以大端字节序读取 8 字节作为 NTP 时间戳
            ntp: data.read_u64::<BigEndian>()?,
            // 以大端字节序读取 4 字节作为 RTP 时间戳
            rtp_timestamp: data.read_u32::<BigEndian>()?,
            // 以大端字节序读取 4 字节作为发送方发送的数据包总数
            sender_packet_count: data.read_u32::<BigEndian>()?,
            // 以大端字节序读取 4 字节作为发送方发送的总字节数
            sender_octet_count: data.read_u32::<BigEndian>()?,
            // 其他字段使用默认值
            ..Default::default()
        };

        // 根据 RTCP 头部中的报告计数，循环读取相应数量的接收报告块
        for _ in 0..sender_report.header.report_count {
            // 调用 ReportBlock 的 unmarshal 方法解析接收报告块
            let report_block = ReportBlock::unmarshal(data)?;
            // 将解析得到的接收报告块添加到报告块向量中
            sender_report.report_blocks.push(report_block);
        }

        // 返回解析成功的 RtcpSenderReport 实例
        Ok(sender_report)
    }
}

impl Marshal<Result<BytesMut, RtcpError>> for RtcpSenderReport {
    fn marshal(&self) -> Result<BytesMut, RtcpError> {
        // 创建一个默认的字节写入器
        let mut writer = BytesWriter::default();

        // 调用 RtcpHeader 的 marshal 方法将 RTCP 头部序列化为字节数据
        let header_bytesmut = self.header.marshal()?;
        // 将序列化后的 RTCP 头部字节数据写入字节写入器
        writer.write(&header_bytesmut[..])?;

        // 以大端字节序将发送方的 SSRC 写入字节写入器
        writer.write_u32::<BigEndian>(self.ssrc)?;
        // 以大端字节序将 NTP 时间戳写入字节写入器
        writer.write_u64::<BigEndian>(self.ntp)?;
        // 以大端字节序将 RTP 时间戳写入字节写入器
        writer.write_u32::<BigEndian>(self.rtp_timestamp)?;
        // 以大端字节序将发送方发送的数据包总数写入字节写入器
        writer.write_u32::<BigEndian>(self.sender_packet_count)?;
        // 以大端字节序将发送方发送的总字节数写入字节写入器
        writer.write_u32::<BigEndian>(self.sender_octet_count)?;

        // 遍历接收报告块向量
        for report_block in &self.report_blocks {
            // 调用 ReportBlock 的 marshal 方法将接收报告块序列化为字节数据
            let data = report_block.marshal()?;
            // 将序列化后的接收报告块字节数据写入字节写入器
            writer.write(&data[..])?;
        }

        // 提取字节写入器中的当前字节数据并返回
        Ok(writer.extract_current_bytes())
    }
}
